// 导入 mysql 包
const mysql = require('mysql')
require('dotenv').config()

// 将回调函数封装为 Promise 方式
class MySql {
  // 构造函数
  constructor(config) {
    // 产生数据库连接池对象： pool
    this.pool = mysql.createPool(config)
  }
  /**
   * query 执行 SQL 语句
   *
   * @param {string} sql 语句
   * @param {array} values 参数数组
   * @returns Promise<Array>
   */
  async query(sql, values) {
    return new Promise((resolve, reject) => {
      this.pool.query(sql, values, (error, results, fields) => {
        if (error) return reject(error)
        resolve([results, fields])
      })
    })
  }
  async select(sql, values) {
    const [results] = await this.query(sql, values)
    return results
  }
  /**
   * findOne
   * 只返回一条记录，适合执行聚合的语句。
   *
   * @param {string} sql select 语句
   * @param {Array} values 参数数组
   * @returns Promise<any>
   */
  async findOne(sql, values) {
    const [[one]] = await this.query(sql, values)
    return one
  }
  /**
   * close 关闭连接池对象
   *
   * @returns void
   */
  async close() {
    return new Promise((resolve, reject) => {
      this.pool.end((err) => {
        if (err) return reject(err)
        resolve()
      })
    })
  }
}
const {
  DB_HOST = 'localhost',
  DB_USER = 'root',
  DB_PASSWORD = '123456',
  DB_DATABASE = 'lhz_ynt',
} = process.env

const db = new MySql({
  host: DB_HOST,
  user: DB_USER,
  password: DB_PASSWORD,
  database: DB_DATABASE,
  connectionLimit: 10,
})

module.exports = { db }
